Este taller es para realizar problemas de Regression y Clasificación
Encuentre dos data set a utilizar:
Recomendación: Utilice los dataset disponisble en la librería scikit-learn http://scikit-learn.org/stable/datasets/
Cada uno escoja un par de dataset diferentes.
In [3]:
#Librerias requeridas para el ejercicio
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
from sklearn import datasets, linear_model
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import GradientBoostingRegressor
import statsmodels.api as sm
import statsmodels.formula.api as smf
In [4]:
#Se selecciona la base de datos Boston para realizar el problema de regresión
boston = datasets.load_boston()
#Se selecciona la base de datos Iris para realizar el problema de clasificación
iris = datasets.load_iris()
In [5]:
#Descargar la base de datos
boston = datasets.load_boston()
boston.DESCR # Descripcion de la base de datos
boston.keys() #Mirar las claves del diccionario
Out[5]:
In [5]:
#convertir la base de datos Boston en un Dataframe de pandas
newboston = pd.DataFrame(boston.data, columns=boston.feature_names)
newboston['PRICE'] = boston.target # Añadir el precio de las casas
newboston.head()
Out[5]:
In [246]:
#Hacer la regresión lineal multiple, usando para ello el precio de las casas
#Se crea un modelo ajustado con todas las características de la base de datos Boston
lm= smf.ols(formula='PRICE ~ CRIM + ZN + INDUS + CHAS + NOX + RM + AGE + DIS + RAD + TAX + PTRATIO + B + LSTAT',
data=newboston).fit()
In [224]:
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, nrows=1, sharey=True, figsize=(14, 6))
sns.regplot(x='PRICE', y='CRIM', ax=ax1, data=newboston)
sns.regplot(x='PRICE', y='ZN', ax=ax2, data=newboston)
sns.regplot(x='PRICE', y='AGE', ax=ax3, data=newboston)
fig, (ax1, ax4, ax5) = plt.subplots(ncols=3, nrows=1, sharey=True, figsize=(14, 6))
sns.regplot(x='PRICE', y='DIS', ax=ax1, data=newboston)
sns.regplot(x='PRICE', y='LSTAT', ax=ax4, data=newboston)
sns.regplot(x='PRICE', y='RM', ax=ax5, data=newboston)
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, nrows=1, sharey=True, figsize=(14, 6))
sns.regplot(x='PRICE', y='INDUS', ax=ax1, data=newboston)
sns.regplot(x='PRICE', y='PTRATIO', ax=ax2, data=newboston)
sns.regplot(x='PRICE', y='RAD', ax=ax3, data=newboston)
fig, (ax3, ax4) = plt.subplots(ncols=2, nrows=1, sharey=True, figsize=(8,5))
sns.regplot(x='PRICE', y='NOX', ax=ax3, data=newboston)
sns.regplot(x='PRICE', y='CHAS', ax=ax4, data=newboston)
fig, (ax3, ax4) = plt.subplots(ncols=2, nrows=1, sharey=True, figsize=(8, 5))
sns.regplot(x='PRICE', y='TAX', ax=ax3, data=newboston)
sns.regplot(x='PRICE', y='B', ax=ax4, data=newboston)
Out[224]:
In [250]:
#Resumen del modelo ajustado, con parámetros que miden la calidad del modelo
lm.summary()
#El modelo tiene un R^(2) igual a 0.741
Out[250]:
In [2]:
#Descargar la base de datos
iris = datasets.load_iris()
iris.DESCR # Descripcion de la base de datos
iris.keys() #Mirar las claves del diccionario
Out[2]:
In [38]:
#Convertir la base de datos Iris en un data frame de pandas
newiris = pd.DataFrame(iris.data, columns=iris.feature_names)
#Descripción de los datos
#newiris.describe()
In [39]:
X = iris.data[:, 2:4] # tomar las ultimas dos columnas (Características del pétalo)
Y = iris.target #Variable categórica
h = 0.02
logreg = linear_model.LogisticRegression(C=2).fit(X, Y) #Se crea un modelo ajustado de los datos
In [40]:
# Acertividad del modelo
logreg.score(X, Y)
Out[40]:
In [41]:
logreg.coef_
Out[41]:
In [42]:
# Representación visual de la precisión del modelo
# Se Trazar el límite de decisión. Para ello, se asigna un color a cada punto en la malla
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(6, 5))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Petal length')
plt.ylabel('Petal width')
plt.title('Clasificación con una regresión logística simple')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
Se hace una regresión polinomial múltiple, con el fin de comparar el desempeño de ésta con una regresión lineal simple y el algoritmo de clasificación y regresión Gradient Boosting Regression Trees (GBRT).
In [11]:
Y = boston.target #Precio de las casa (Variable dependiente)
X = boston.data # variables independientes
poly = PolynomialFeatures(degree=3) # Se hace una transformación polinómica de las variables independientes
X_ = poly.fit_transform(X)
clf = smf.OLS(Y,X_).fit() #Regresión polinomial múltiple
clf.summary()
Out[11]:
A continuación, se hace una regresión implementando el algoritmo de clasificación y regresión Gradient Boosting Regression Trees (GBRT)
In [9]:
Y = boston.target #Precio de las casa (Variable dependiente)
X = boston.data # variables independientes
clasificacion = GradientBoostingRegressor(n_estimators=500, learning_rate=0.05, max_depth=1, random_state=0, loss='ls').fit(X, Y)
clasificacion.score(X, Y)
Out[9]:
A paritr de los análisis de regresión realizados para la base de datos Boston, se puede concluir que la regresión polinomial tuvo el mejor desempeño, seguida por el modelo de clasificación y regresión GBRT, con un R^(2) de 0.998 y 0.910, respectivamente.
Se implementa el algoritmo de clasificación Gradient Boosting Trees (GBRT), con el fin de comparar el desempeño de éste y una regresión logística.
In [34]:
X = iris.data[:, 2:4] # Características del pétalo
Y = iris.target #Variable categórica
clasificacion = GradientBoostingClassifier(n_estimators=500, learning_rate=0.05,
max_depth=1, random_state=0).fit(X, Y)
clasificacion.score(X, Y)
Out[34]:
In [33]:
# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = clasificacion.predict(np.c_[xx.ravel(), yy.ravel()])
# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(6, 5))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Petal length')
plt.ylabel('Petal width')
plt.title('Clasificación por GBRT')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
A paritr de los análisis de clasificación realizados para la base de datos Iris, se puede concluir que con el modelo de clasificación GBRT se tuvo el mejor desempeño, seguida por la regresión logística simple, con un valor de precisión (score) de 0.97 y 0.88, respectivamente.